/**
 * 格式化监听属性
 * 直接修改viewModel属性
 */
const forMatVueWatch = (exportDefault, lowCodePageJson) => {
  let watchObj = {};

  // 如果当前页面没有watch属性
  if(!exportDefault.watch) return

  // 遍历watch属性

  /**
   * 需要生成一个函数插入到methods中
   * 当为handler和函数式监听时需要做特殊处理
   * 如果是函数的值，就deep, immediate都为false
   * 如果是对象的话，就去获取对象上的deep属性和immediate属性
   */
  Object.keys(exportDefault.watch).forEach(v=> {
    // 构建监听对象
    let option = {};
    // 因为有可能出现 "a.b.c"的情况，所以需要处理一下
    const watchProps = v.split('.');
    const watchFnName = `${watchProps.join('_')}_watchFn`;
    // 区分是简单监听还是深度监听
    if(exportDefault.watch[v] instanceof Function){
      // 普通监听
      option = {
        deep: false,
        immediate: false,
        targetFn: getMethodContent(exportDefault.watch[v])
      }
    }else{
      // 深度监听
      option = {
        deep: exportDefault.watch[v].deep || false,
        immediate: exportDefault.watch[v].immediate || false,
        targetFn: getMethodContent(exportDefault.watch[v].handler)
      }
    }
    
    // 插入到methods中
    lowCodePageJson.methods.push(forMatAsyncMethodNode(watchFnName, option.targetFn.content, option.targetFn.paramNames, `${v}的监听函数`))
    
    // 单属性监听
    if(watchProps.length == 1){
      if(lowCodePageJson.viewModel[v]){
        lowCodePageJson.viewModel[v].watch = {
            logic: watchFnName,
            deep: option.deep,
            immediate: option.immediate
        }
      }
    }

    // 多层属性监听
    if(watchProps.length > 1){
      let targetObj = lookUp(lowCodePageJson.viewModel, v);
      if(targetObj){
        targetObj.watch = {
          logic: watchFnName,
          deep: option.deep,
          immediate: option.immediate
        }
      }
    }

  })
  
}

/**
 * 使用点操作符逐级访问对象属性
 * @param {Object} model - 要访问的对象
 * @param {string} path - 属性路径字符串，例如 "a.b.c"
 * @returns {*} - 对应路径的值，如果路径不存在则返回 undefined
 */
function lookUp(model, path) {
  if (!model || typeof path !== 'string') {
      return undefined;
  }

  return path.split('.').reduce((current, key) => {
      return current ? current[key] : undefined;
  }, model);
}